home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / psydecode.asm < prev    next >
Assembly Source File  |  2000-04-12  |  3KB  |  204 lines

  1. ; *** Psygnosis disk utilities V1.1
  2. ; *** Written by Jean-François Fabre
  3.  
  4.     XDEF    _DecodeTrack
  5.     XDEF    @DecodeTrack
  6.  
  7.  
  8. DECODEREG EQUR D6
  9.  
  10.  
  11. ; ** out D0: <0: error 
  12.  
  13. ; ** C entrypoint
  14.  
  15.  
  16. ; *** finds sync and shift
  17.  
  18. ; in A0 rawdata
  19. ; out: D0 = 0 if success
  20. ;      D1 = shift (0-15)
  21.  
  22. GetSync:
  23.     movem.l    D2-D6/A1-A6,-(sp)
  24.  
  25.     MOVE.L    A0,A2
  26.     lea    $7C00(A2),A4        ;end of rawtrack
  27.  
  28. .SHF2    MOVEQ.L    #$10-1,D5
  29.  
  30.     ; *** try to find the sync shift (0 to 15)
  31.  
  32. .SHF1    MOVE.L    (A2),D0        ; a longword of data
  33.     LSR.L    D5,D0        ; shift it by D5
  34.     CMP.W    #$4489,D0    ; sync?
  35.     BEQ.S    .SY        ; yes: found sync AND shift
  36.     DBF    D5,.SHF1
  37.     ADDQ.L    #2,A2
  38.     cmp.l    A2,A4
  39.     beq    ErrorSyn
  40.     BRA.S    .SHF2
  41.  
  42.     ; ** shift has been found, sync too.
  43.  
  44. .SY    MOVE.L    (A2),D0
  45.     ADDQ.L    #2,A2
  46.     LSR.L    D5,D0            ;d5 is the shifting-number when sync was found
  47.     CMP.W    #$4489,D0
  48.     BNE.S    .SY
  49.  
  50. .1    MOVE.L    (A2),D0
  51.     ADDQ.L    #2,A2
  52.     LSR.L    D5,D0
  53.     CMP.W    #$4489,D0
  54.     BEQ.S    .1
  55.  
  56.     moveq    #0,D0
  57.     move.l    A2,A0    ; buffer synced
  58.     move.l    D5,D1    ; shift
  59.     bra    ExitSyn
  60.  
  61. ErrorSyn:
  62.     moveq    #-1,D0
  63. ExitSyn
  64.     movem.l    (sp)+,D2-D6/A1-A6
  65.     rts
  66.  
  67. ; ** assembly entrypoint
  68.  
  69. _DecodeTrack:
  70.     move.l    4(sp),D0
  71.     move.l    8(sp),A0
  72.  
  73. @DecodeTrack:
  74.     movem.l    D1-A6,-(sp)
  75.  
  76.     move.l    A0,A1    ; dec
  77.     move.l    D0,A0    ; raw
  78.  
  79.     bsr    GetSync
  80.     tst.l    D0
  81.     bne    syncerr
  82.  
  83.     move.l    D1,D6    ; shift
  84.  
  85.     MOVE    #$0400,D7
  86.     moveq.l    #0,D1
  87.     subq.l    #2,A0
  88.         
  89.     ; *** 6 stages to decode the buffer
  90.  
  91. decloop
  92.     BSR    DecodeRawData
  93.     TST    D0
  94.     bne    exit
  95.     LEA    $400(A1),A1
  96.     addq.l    #1,D1
  97.     cmp.l    #6,D1
  98.     bne    decloop
  99.     moveq.l    #0,D0
  100. exit:
  101.     MOVEM.L    (A7)+,D1-A6
  102.     RTS
  103.  
  104. syncerr
  105.     moveq    #-2,D0
  106.     bra    exit
  107.  
  108. ; ** in A1: decoded buffer
  109. ;       A0: raw buffer
  110.  
  111. ;       D7: # of bytes to decode
  112. ;    D1: part of the track to decode (0-3)
  113.  
  114. DecodeRawData:
  115.     MOVEM.L    D1/D6-D7/A0-A1,-(A7)
  116.     LEA    2(A0),A0
  117.     MULU    #$0804,D1
  118.     ADDA.L    D1,A0        ; offset
  119.     MOVE    D7,-(sp)
  120.     MOVEQ    #2,D7
  121.     BSR    DecodeRawPart    ; decode 2 words -> 2 bytes
  122.     MOVE    (A1),D0        ; checksum
  123.  
  124.     MOVE    (sp)+,D7
  125.     BSR    DecodeRawPart    ; decode D7 words -> D7 bytes
  126.     CMP    #$0400,D7    ; $400 initially asked?
  127.     BNE    DRD_ok        ; no -> return without error
  128.     BSR    ChecksumData    ; calculates theoric checksum
  129.     SUB    D1,D0        ; compares with checksum read
  130.     BEQ    DRD_ok        ; ok
  131.     MOVEQ    #-1,D0        ; error, wrong checksum
  132.     bra    DRD_exit
  133. DRD_ok
  134.     moveq.l    #0,D0
  135. DRD_exit
  136.     MOVEM.L    (A7)+,D1/D6-D7/A0-A1
  137.     RTS
  138.  
  139. ; *** calculates checksum
  140.  
  141. ; in : A1 pointer on decoded data
  142. ; out: D1 checksum
  143.  
  144. ChecksumData:
  145.     MOVEM.L    D7/A1,-(A7)
  146.     MOVE    #$01FF,D7
  147.     MOVEQ    #0,D1
  148. LAB_0027:
  149.     ADD.W    (A1)+,D1
  150.     DBF    D7,LAB_0027
  151.     MOVEM.L    (A7)+,D7/A1
  152.     RTS
  153.  
  154. ; ** in  A1: decoded data buffer
  155. ; **     D7: # of words->bytes to decode
  156.  
  157. DecodeRawPart:
  158.     MOVEM.L    D0-D7/A1,-(A7)
  159.     LSR    #1,D7
  160.     SUBQ    #1,D7
  161.     MOVE    #$5555,D4
  162.     MOVE    #$AAAA,D5
  163. LAB_003C:
  164.     ; ** harry's code
  165.  
  166.     movem.l    D3-D4,-(sp)
  167.     move.l    (A0)+,D0    ; higher part (dest register)
  168.     move.l    (A0),D3
  169.     lsr.l    D6,D3        ; shift lower part with count
  170.     moveq    #$20,D4
  171.     sub.l    D6,D4
  172.     lsl.l    D4,D0        ;higher part has to be shifted to fill
  173.     or.l    D3,D0        ;the rest-place, a longword has 20 bits
  174.     movem.l    (sp)+,D3-D4    
  175.  
  176.     move.w    D0,D1    ; D1: low
  177.     swap    D0        ; D0: high
  178.  
  179. ;    MOVE    (A0)+,D0
  180. ;    MOVE    (A0)+,D1    ; original
  181.  
  182.     ASL    #1,D0
  183.     AND    D5,D0
  184.     AND    D4,D1
  185.     OR    D1,D0
  186.     MOVE.W    D0,(A1)+
  187.     DBF    D7,LAB_003C
  188.     MOVEM.L    (A7)+,D0-D7/A1
  189.     RTS
  190.     
  191.  
  192. DiskId
  193.     dc.l    0
  194. nbsectors:
  195.     dc.l    0
  196. worklen:
  197.     dc.l    0
  198. blockbuffer:
  199.     dc.l    0
  200. blocksize:
  201.     dc.l    0
  202. returncode:
  203.     dc.l    0
  204.